package io.gitee.hchaojie.day01.exam;

import org.junit.Test;

import java.util.Arrays;

public class Exam1 {

    
    /**
     * 写一个程序，用来交换两个整形变量a和b的值。
     */
    @Test
    public void testSwap() {
        int a = 10;
        int b = 5;

        int temp = b;
        b = a;
        a = temp;

        System.out.println("a: " + a + " b:" + b);
    }

    /**
     * 写一个程序，用来交换两个整形变量a和b的值。
     *
     * 方式二
     */
    @Test
    public void testSwap2() {
        int a = 10;
        int b = 5;
        
        a = (a + b);
        b = (a - b);
        a = (a - b);
        
        System.out.println("a: " + a + " b:" + b);
    }

    /**
     * 写一个程序，计算两点之间的欧几里得距离
     */
    @Test
    public void testDistance() {
        double x1 = 2.0;
        double y1 = 2.0;
        double x2 = 100.99;
        double y2 = 88.5;

        double distance = Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2));
        
        System.out.println(distance);
    }

    /**
     * 鸡汤大师的人生复利公式：
     * 每天进步1%， 一年功力提升37倍。
     * 每天退步1%，一年功力退化为0.
     * 写一个程序，计算并验证上述公式的正确性。
     */
    @Test
    public void testSoup() {
        // 1 * (1 + 0.01) * (1 + 0.01) * ...
        System.out.println(Math.pow((1 + 0.01), 365));

        System.out.println(Math.pow(1 - 0.01, 365));
    }

    /**
     * 修改前面的程序，让两点的坐标以参数的形式传入程序。多次运行程序，传入不同的坐标参数，验证结果。
     * 需要解决的问题：
     * 如何给程序传递参数？
     * 字符串如何转换成double类型？
     *
     * 注意这个不要用单元测试，而是使用常规的java程序入口写
     */
    public static void main(String[] args) {        // args是外部传入的参数
//        System.out.println(Arrays.toString(args));



        // String -> double
        // Integer.parseInt
                // 包装类型 ， 任何基本类型，都有对应的包装类型

        double x1 = Double.parseDouble(args[0]);
        double y1 = Double.parseDouble(args[1]);
        double x2 = Double.parseDouble(args[2]);
        double y2 = Double.parseDouble(args[3]);        // 字符串转double

        double distance = Math.sqrt(Math.pow(x1 -x2, 2) + Math.pow(y1 - y2, 2));

        System.out.println(distance);
    }

    /**
     * -	抽奖程序
     */
    @Test
    public void testLucky() {
        int lucky = (int) (Math.random() * 30) + 1;

        System.out.println(lucky);
    }

    /**
     * -	闰年判断
     */
    @Test
    public void testLeapYear() {
        System.out.println(isLeapYear(1900));
        System.out.println(isLeapYear(2000));
        System.out.println(isLeapYear(2004));
        System.out.println(isLeapYear(2016));
    }

    public boolean isLeapYear(int year) {
        return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
    }

    /**
     * -	计算并打印short类型数据的最大值，分别以十进制、二进制和十六进制打印
     */
    @Test
    public void testPrintShort() {
        // short s = (short)(Math.pow(2, 15) - 1);
        // short s = Short.MAX_VALUE;
        short s = (1 << 15) - 1;    // << 比 - 优先级低
        System.out.println(s);
        System.out.println(Integer.toBinaryString(s));
        System.out.println(Integer.toHexString(s));
    }

    /**
     * -	假设一个盒子放8个鸡蛋，一共有n个鸡蛋，需要几个盒子装？用程序如何计算？
     */
    @Test
    public void testEgg() {
        int n = 118;
        int size = 8;

        // 三种方式
        // int box = (n % size == 0) ? (n / size) : (n / size) + 1;
        // int box = (int) Math.ceil((double) n / size);

        int box = (n - 1) / size + 1;
        
        System.out.println("一共需要盒子数：" + box);
    }


}
